--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXMF/Utilities/lxmd.py 241b29cc92b15907bc0c17cfb7a41a17669e50ac (241b29cc) Text, 55.88 KB
T8b949e#!/usr/bin/env python3
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2020-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Te6edf3DEFFERED_JOBS_DELAY Tff7b72= T79c0ff10
Te6edf3JOBS_INTERVAL Tff7b72= T79c0ff5
Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787argparse
Tff7b72import T7ee787threading
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787shlex
Tff7b72import T7ee787time
Tff7b72import T7ee787os
Tff7b72from T7ee787LXMFT7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787LXMF Tff7b72import Te6edf3APP_NAME
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Te6edf3configpath Tff7b72= Tff7b72None
Te6edf3ignoredpath Tff7b72= Tff7b72None
Te6edf3identitypath Tff7b72= Tff7b72None
Te6edf3storagedir Tff7b72= Tff7b72None
Te6edf3lxmdir Tff7b72= Tff7b72None
Te6edf3targetloglevel Tff7b72= Tff7b72None
Te6edf3identity Tff7b72= Tff7b72None
Te6edf3lxmd_config Tff7b72= Tff7b72None
Te6edf3message_router Tff7b72= Tff7b72None
Te6edf3lxmf_destination Tff7b72= Tff7b72None
Te6edf3active_configuration Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3last_peer_announce Tff7b72= Tff7b72None
Te6edf3last_node_announce Tff7b72= Tff7b72None
Tff7b72def Td2a8ffcreate_default_configTb4b4b4(Te6edf3configpathTb4b4b4)Tb4b4b4:
Te6edf3lxmd_config Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_lxmd_config__Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3lxmd_configTff7b72.Td2a8fffilename Tff7b72= Te6edf3configpath
Te6edf3lxmd_configTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffapply_configTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Tff7b72tryTb4b4b4:
T8b949e# Load peer settings
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffAnonymous PeerTa5d6ff"
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)Tff7b72*T79c0ff60
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffstamp_costTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_stamp_costTa5d6ff"Tb4b4b4] Tff7b72= Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffstamp_costTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_stamp_costTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff12
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.38Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.38
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff1000
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffon_inboundTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
T8b949e# Load propagation node settings
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffenable_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffenable_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffnode_nameTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffautopeerTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffsequential_pn_stamp_validationTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffsequential_pn_stamp_validationTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffsequential_pn_stamp_validationTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffsequential_pn_stamp_validationTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffstatic_peers_bypass_sequentialTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peers_bypass_sequentialTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffstatic_peers_bypass_sequentialTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peers_bypass_sequentialTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffmax_inbound_syncsTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmax_inbound_syncsTa5d6ff"Tb4b4b4] Tff7b72= Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffmax_inbound_syncsTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmax_inbound_syncsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff3
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)Tff7b72*T79c0ff60
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.005Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.005
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff500
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.38Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.38
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff256
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpropagation_message_max_accepted_sizeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_message_max_accepted_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.38Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.38
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff256
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.38Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.38
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff256Tff7b72*T79c0ff40
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff"Tb4b4b4] Tff7b72< Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPROPAGATION_COST_MINTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPROPAGATION_COST_MIN
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPROPAGATION_COST
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPROPAGATION_COST_FLEX
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpeering_costTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPEERING_COST
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffMAX_PEERING_COST
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffprioritised_lxmf_destinationsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffprioritised_lxmf_destinationsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffcontrol_allowedTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffcontrol_allowed_identitiesTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffcontrol_allowedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffcontrol_allowed_identitiesTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3static_peers Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3static_peer Tff7b72in Te6edf3static_peersTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3static_peerTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffmax_peersTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6fffrom_static_onlyTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6fffrom_static_onlyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6fffrom_static_onlyTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6fffrom_static_onlyTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
T8b949e# Load various settings
Tff7b72if Ta5d6ff"Ta5d6ffloggingTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffloglevelTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3targetloglevel Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffloglevelTa5d6ff"Tb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffignored_lxmf_destinationsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3ignoredpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fh Tff7b72= Tffa657openTb4b4b4(Te6edf3ignoredpathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3ignored_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fhTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3ignored_hash_strs Tff7b72= Te6edf3ignored_inputTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3hash_str Tff7b72in Te6edf3ignored_hash_strsTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ignored_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_strTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffignored_lxmf_destinationsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3ignored_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode hash from: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hash_strTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while loading list of ignored destinations: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3allowedpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fh Tff7b72= Tffa657openTb4b4b4(Te6edf3allowedpathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3allowed_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fhTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3allowed_hash_strs Tff7b72= Te6edf3allowed_inputTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3hash_str Tff7b72in Te6edf3allowed_hash_strsTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3allowed_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_strTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3allowed_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode hash from: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hash_strTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while loading list of allowed identities: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not apply LXM Daemon configuration. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Te6edf3e
Te6edf3exitTb4b4b4(T79c0ff3Tb4b4b4)
Tff7b72def Td2a8fflxmf_deliveryTb4b4b4(Te6edf3lxmTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3lxmdir
Tff7b72tryTb4b4b4:
Te6edf3written_path Tff7b72= Te6edf3lxmTff7b72.Td2a8ffwrite_to_directoryTb4b4b4(Te6edf3lxmdirTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff written to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3written_pathTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCalling external program to handle messageTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3command Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4]
Te6edf3processing_command Tff7b72= Te6edf3commandTff7b72+Ta5d6ff"Ta5d6ff Tffea00\"Ta5d6ff"Tff7b72+Te6edf3written_pathTff7b72+Ta5d6ff"Tffea00\"Ta5d6ff"
Te6edf3return_code Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffcallTb4b4b4(Te6edf3shlexTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3processing_commandTb4b4b4)Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo action defined for inbound messages, ignoringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError occurred while processing received message Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3run_pn Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3on_inbound Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3quietness Tff7b72= T79c0ff0Tb4b4b4, Te6edf3service Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3configpathTb4b4b4, Te6edf3ignoredpathTb4b4b4, Te6edf3identitypathTb4b4b4, Te6edf3allowedpathTb4b4b4, Te6edf3storagedirTb4b4b4, Te6edf3lxmdir
Tff7b72global Te6edf3lxmd_configTb4b4b4, Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Tff7b72global Te6edf3message_routerTb4b4b4, Te6edf3lxmf_destination
Tff7b72if Te6edf3serviceTb4b4b4:
Te6edf3targetlogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_FILE
Te6edf3targetloglevel Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3targetlogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_STDOUT
T8b949e# Get configuration
Tff7b72if Te6edf3configdir Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Ta5d6ff"Ta5d6ff/etc/lxmdTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/etc/lxmd/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3configdir Tff7b72= Ta5d6ff"Ta5d6ff/etc/lxmdTa5d6ff"
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmdTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmd/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3configdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmdTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3configdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.lxmdTa5d6ff"
Te6edf3configpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Te6edf3ignoredpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/ignoredTa5d6ff"
Te6edf3allowedpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/allowedTa5d6ff"
Te6edf3identitypath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/identityTa5d6ff"
Te6edf3storagedir Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/storageTa5d6ff"
Te6edf3lxmdir Tff7b72= Te6edf3storagedirTff7b72+Ta5d6ff"Ta5d6ff/messagesTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3storagedirTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3storagedirTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3lxmdirTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3lxmdirTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3configpathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load config file, creating default configuration file...Ta5d6ff"Tb4b4b4)
Te6edf3create_default_configTb4b4b4(Te6edf3configpathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDefault config file created. Make any necessary changes in Ta5d6ff"Tff7b72+Te6edf3configpathTff7b72+Ta5d6ff"Ta5d6ff and restart lxmd if needed.Ta5d6ff"Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.5Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3configpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3lxmd_config Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3configpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Te6edf3configpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCheck your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Te6edf3apply_configTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConfiguration loaded from Ta5d6ff"Tff7b72+Te6edf3configpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72if Te6edf3targetloglevel Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3targetloglevel Tff7b72= T79c0ff3
Tff7b72if Te6edf3verbosity Tff7b72!= T79c0ff0 Tff7b72or Te6edf3quietness Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3targetloglevel Tff7b72= Te6edf3targetloglevelTff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness
T8b949e# Start Reticulum
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSubstantiating Reticulum...Ta5d6ff"Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3rnsconfigdirTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4, Te6edf3logdestTff7b72=Te6edf3targetlogdestTb4b4b4)
Tff7b72if Te6edf3targetlogdest Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLOG_FILETb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogfile Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/logfileTa5d6ff"
T8b949e# Generate or load primary identity
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identitypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Te6edf3identitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff4Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Te6edf3identitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo Primary Identity file found, creating new...Ta5d6ff"Tb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated new Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new Primary IdentityTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
T8b949e# Start LXMF
Te6edf3message_router Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTb4b4b4(
Te6edf3identity Tff7b72= Te6edf3identityTb4b4b4,
Te6edf3storagepath Tff7b72= Te6edf3storagedirTb4b4b4,
Te6edf3autopeer Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3autopeer_maxdepth Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3propagation_limit Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3propagation_cost Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_targetTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3propagation_cost_flexibility Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3sequential_validation Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffsequential_pn_stamp_validationTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3static_sequential Tff7b72= Tff7b72not Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peers_bypass_sequentialTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3max_inbound_syncs Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmax_inbound_syncsTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3peering_cost Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3max_peering_cost Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffremote_peering_cost_maxTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3sync_limit Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_max_accepted_sizeTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3delivery_limit Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3max_peers Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3static_peers Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3from_static_only Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6fffrom_static_onlyTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3name Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Te6edf3lxmf_deliveryTb4b4b4)
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffignored_lxmf_destinationsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffignore_destinationTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3lxmf_destination Tff7b72= Te6edf3message_routerTff7b72.Td2a8ffregister_delivery_identityTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3display_nameTff7b72=Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3stamp_costTff7b72=Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_stamp_costTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTb4b4b4(
Te6edf3packet_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3destination_hashTff7b72=Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3public_keyTff7b72=Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3app_dataTff7b72=Tff7b72None
Tb4b4b4)
T8b949e# Set up authentication
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffset_authenticationTb4b4b4(Te6edf3requiredTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffClint authentication was enabled, but no identity hashes could be loaded from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3allowedpathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Nobody will be able to sync messages from this propagation node.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffallowTb4b4b4(Te6edf3identity_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Router ready to receive on Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3run_pn Tff7b72or Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffenable_propagation_nodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffset_message_storage_limitTb4b4b4(Te6edf3megabytesTff7b72=Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72for Te6edf3dest_str Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffprioritised_lxmf_destinationsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3dest_strTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dest_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Te6edf3message_routerTff7b72.Td2a8ffprioritiseTb4b4b4(Te6edf3dest_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCannot prioritise Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3dest_strTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, it is not a valid destination hashTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffenable_propagationTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3ident_str Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffcontrol_allowed_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3ident_strTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Te6edf3message_routerTff7b72.Td2a8ffallow_controlTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot allow control from Tffd700{Te6edf3ident_strTffd700}Ta5d6ff, it is not a valid identity hashTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Propagation Node started on Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3message_routerTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarted lxmd version Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3deferred_start_jobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffjobsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3last_peer_announceTb4b4b4, Te6edf3last_node_announce
Tff7b72global Te6edf3message_routerTb4b4b4, Te6edf3lxmf_destination
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff" Tff7b72in Te6edf3active_configuration Tff7b72and Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3last_peer_announce Tff7b72+ Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF delivery destinationTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3last_peer_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff" Tff7b72in Te6edf3active_configuration Tff7b72and Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3last_node_announce Tff7b72+ Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF Propagation NodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounce_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3last_node_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while running periodic jobs. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3JOBS_INTERVALTb4b4b4)
Tff7b72def Td2a8ffdeferred_start_jobsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3last_peer_announceTb4b4b4, Te6edf3last_node_announce
Tff7b72global Te6edf3message_routerTb4b4b4, Te6edf3lxmf_destination
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3DEFFERED_JOBS_DELAYTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRunning deferred start jobsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_at_startTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF delivery destinationTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_at_startTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF Propagation NodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounce_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3last_peer_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3last_node_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_request_syncTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff15Tb4b4b4, Te6edf3exit_on_failTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3control_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontrolTa5d6ff"Tb4b4b4)
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72def Td2a8ffcheck_timeoutTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72if Te6edf3exit_on_failTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRequesting lxmd peer sync timed out, exiting nowTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_TIMEOUT
Tff7b72elseTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4:
Tff7b72return Te6edf3tc
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3control_destinationTb4b4b4)
Tff7b72while Tff7b72not Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4:
Tff7b72return Te6edf3tc
Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3request_receipt Tff7b72= Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffSYNC_REQUEST_PATHTb4b4b4, Te6edf3dataTff7b72=Te6edf3destination_hashTb4b4b4, Te6edf3response_callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3failed_callbackTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72while Tff7b72not Te6edf3request_receiptTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffRequestReceiptTff7b72.Td2a8ffREADYTb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4:
Tff7b72return Te6edf3tc
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3request_receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffrequest_syncTb4b4b4(Te6edf3targetTb4b4b4, Te6edf3remoteTff7b72=Tff7b72NoneTb4b4b4, Te6edf3configdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3verbosityTff7b72=T79c0ff0Tb4b4b4, Te6edf3quietnessTff7b72=T79c0ff0Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff15Tb4b4b4, Te6edf3identity_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3configpathTb4b4b4, Te6edf3identitypathTb4b4b4, Te6edf3storagedirTb4b4b4, Te6edf3lxmdir
Tff7b72global Te6edf3lxmd_configTb4b4b4, Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Tff7b72tryTb4b4b4:
Te6edf3peer_destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3peer_destination_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDestination hash length must be Tffd700{Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tffd700}Ta5d6ff charactersTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid peer destination hash: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff203Tb4b4b4)
Te6edf3remote
Te6edf3_remote_initTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3verbosityTb4b4b4, Te6edf3quietnessTb4b4b4, Te6edf3identity_pathTb4b4b4)
Te6edf3response Tff7b72= Te6edf3_request_syncTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3peer_destination_hashTb4b4b4, Te6edf3remote_identityTff7b72=Te6edf3_get_target_identityTb4b4b4(Te6edf3remoteTb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4, Te6edf3exit_on_failTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRemote received no identityTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff203Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NO_ACCESSTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAccess deniedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff204Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_INVALID_DATATb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data received by remoteTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff205Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NOT_FOUNDTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe requested peer was not foundTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff206Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEmpty response receivedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff207Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSync requested for peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3peer_destination_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ff_request_unpeerTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff15Tb4b4b4, Te6edf3exit_on_failTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3control_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontrolTa5d6ff"Tb4b4b4)
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72def Td2a8ffcheck_timeoutTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72if Te6edf3exit_on_failTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRequesting lxmd peering break timed out, exiting nowTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_TIMEOUT
Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4:
Tff7b72return Te6edf3tc
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3control_destinationTb4b4b4)
Tff7b72while Tff7b72not Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4:
Tff7b72return Te6edf3tc
Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3request_receipt Tff7b72= Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffUNPEER_REQUEST_PATHTb4b4b4, Te6edf3dataTff7b72=Te6edf3destination_hashTb4b4b4, Te6edf3response_callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3failed_callbackTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72while Tff7b72not Te6edf3request_receiptTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffRequestReceiptTff7b72.Td2a8ffREADYTb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4:
Tff7b72return Te6edf3tc
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3request_receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffrequest_unpeerTb4b4b4(Te6edf3targetTb4b4b4, Te6edf3remoteTff7b72=Tff7b72NoneTb4b4b4, Te6edf3configdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3verbosityTff7b72=T79c0ff0Tb4b4b4, Te6edf3quietnessTff7b72=T79c0ff0Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff15Tb4b4b4, Te6edf3identity_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3configpathTb4b4b4, Te6edf3identitypathTb4b4b4, Te6edf3storagedirTb4b4b4, Te6edf3lxmdir
Tff7b72global Te6edf3lxmd_configTb4b4b4, Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Tff7b72tryTb4b4b4:
Te6edf3peer_destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3peer_destination_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDestination hash length must be Tffd700{Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tffd700}Ta5d6ff charactersTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid peer destination hash: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff203Tb4b4b4)
Te6edf3remote
Te6edf3_remote_initTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3verbosityTb4b4b4, Te6edf3quietnessTb4b4b4, Te6edf3identity_pathTb4b4b4)
Te6edf3response Tff7b72= Te6edf3_request_unpeerTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3peer_destination_hashTb4b4b4, Te6edf3remote_identityTff7b72=Te6edf3_get_target_identityTb4b4b4(Te6edf3remoteTb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4, Te6edf3exit_on_failTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRemote received no identityTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff203Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NO_ACCESSTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAccess deniedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff204Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_INVALID_DATATb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data received by remoteTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff205Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NOT_FOUNDTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe requested peer was not foundTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff206Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEmpty response receivedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff207Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBroke peering with Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3peer_destination_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffquery_statusTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3remote_identityTff7b72=Tff7b72NoneTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4, Te6edf3exit_on_failTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3remote_identity Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3remote_identity Tff7b72= Te6edf3identity
Te6edf3control_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontrolTa5d6ff"Tb4b4b4)
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72def Td2a8ffcheck_timeoutTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72if Te6edf3exit_on_failTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffGetting lxmd statistics timed out, exiting nowTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_TIMEOUT
Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3control_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4: Tff7b72return Te6edf3tc
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3control_destinationTb4b4b4)
Tff7b72while Tff7b72not Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4: Tff7b72return Te6edf3tc
Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3request_receipt Tff7b72= Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffSTATS_GET_PATHTb4b4b4, Te6edf3dataTff7b72=Tff7b72NoneTb4b4b4, Te6edf3response_callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3failed_callbackTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72while Tff7b72not Te6edf3request_receiptTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffRequestReceiptTff7b72.Td2a8ffREADYTb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4: Tff7b72return Te6edf3tc
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3request_receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffget_statusTb4b4b4(Te6edf3remoteTff7b72=Tff7b72NoneTb4b4b4, Te6edf3configdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3verbosityTff7b72=T79c0ff0Tb4b4b4, Te6edf3quietnessTff7b72=T79c0ff0Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4,
Te6edf3show_statusTff7b72=Tff7b72FalseTb4b4b4, Te6edf3show_peersTff7b72=Tff7b72FalseTb4b4b4, Te6edf3identity_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3identity
Te6edf3_remote_initTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3verbosityTb4b4b4, Te6edf3quietnessTb4b4b4, Te6edf3identity_pathTb4b4b4)
Te6edf3response Tff7b72= Te6edf3query_statusTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3remote_identityTff7b72=Te6edf3_get_target_identityTb4b4b4(Te6edf3remoteTb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4, Te6edf3exit_on_failTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRemote received no identityTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff203Tb4b4b4)
Tff7b72if Te6edf3response Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffLXMPeerTff7b72.Td2a8ffERROR_NO_ACCESSTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAccess deniedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff204Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEmpty response receivedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff207Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3s Tff7b72= Te6edf3response
Te6edf3mutil Tff7b72= Tffa657roundTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmessagestoreTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffbytesTa5d6ff"Tb4b4b4]Tff7b72/Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmessagestoreTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflimitTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72*T79c0ff100Tb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3ms_util Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3mutilTffd700}Ta5d6ff%Ta5d6ff"
Tff7b72if Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6fffrom_static_onlyTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3who_str Tff7b72= Ta5d6ff"Ta5d6ffstatic peers onlyTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3who_str Tff7b72= Ta5d6ff"Ta5d6ffall nodesTa5d6ff"
Te6edf3available_peers Tff7b72= T79c0ff0
Te6edf3unreachable_peers Tff7b72= T79c0ff0
Te6edf3peered_incoming Tff7b72= T79c0ff0
Te6edf3peered_outgoing Tff7b72= T79c0ff0
Te6edf3peered_rx_bytes Tff7b72= T79c0ff0
Te6edf3peered_tx_bytes Tff7b72= T79c0ff0
Tff7b72for Te6edf3peer_id Tff7b72in Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3p Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3peer_idTb4b4b4]
Te6edf3pm Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffmessagesTa5d6ff"Tb4b4b4]
Te6edf3peered_incoming Tff7b72+Tff7b72= Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffincomingTa5d6ff"Tb4b4b4]
Te6edf3peered_outgoing Tff7b72+Tff7b72= Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffoutgoingTa5d6ff"Tb4b4b4]
Te6edf3peered_rx_bytes Tff7b72+Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4]
Te6edf3peered_tx_bytes Tff7b72+Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffaliveTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3available_peers Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4: Te6edf3unreachable_peers Tff7b72+Tff7b72= T79c0ff1
Te6edf3total_incoming Tff7b72= Te6edf3peered_incomingTff7b72+Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffunpeered_propagation_incomingTa5d6ff"Tb4b4b4]Tff7b72+Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffclient_propagation_messages_receivedTa5d6ff"Tb4b4b4]
Te6edf3total_rx_bytes Tff7b72= Te6edf3peered_rx_bytesTff7b72+Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffunpeered_propagation_rx_bytesTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3total_incoming Tff7b72!= T79c0ff0Tb4b4b4: Te6edf3df Tff7b72= Tffa657roundTb4b4b4(Te6edf3peered_outgoingTff7b72/Te6edf3total_incomingTb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3df Tff7b72= T79c0ff0
Te6edf3dhs Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4; Te6edf3uts Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffuptimeTa5d6ff"Tb4b4b4]Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffLXMF Propagation Node running on Tffd700{Te6edf3dhsTffd700}Ta5d6ff, uptime is Tffd700{Te6edf3utsTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3show_statusTb4b4b4:
Te6edf3msb Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmessagestoreTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffbytesTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4; Te6edf3msl Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmessagestoreTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflimitTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3ptl Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_limitTa5d6ff"Tb4b4b4]Tff7b72*T79c0ff1000Tb4b4b4)Tb4b4b4; Te6edf3psl Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffsync_limitTa5d6ff"Tb4b4b4]Tff7b72*T79c0ff1000Tb4b4b4)Tb4b4b4;
Te6edf3uprx Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffunpeered_propagation_rx_bytesTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3mscnt Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmessagestoreTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3stp Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6fftotal_peersTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3smp Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3sdp Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffdiscovered_peersTa5d6ff"Tb4b4b4]
Te6edf3ssp Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3cprr Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffclient_propagation_messages_receivedTa5d6ff"Tb4b4b4]
Te6edf3cprs Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffclient_propagation_messages_servedTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3upi Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffunpeered_propagation_incomingTa5d6ff"Tb4b4b4]
Te6edf3psc Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6fftarget_stamp_costTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3scf Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffstamp_cost_flexibilityTa5d6ff"Tb4b4b4]
Te6edf3pc Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3pcm Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffmax_peering_costTa5d6ff"Tb4b4b4]
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMessagestore contains Tffd700{Te6edf3mscntTffd700}Ta5d6ff messages, Tffd700{Te6edf3msbTffd700}Ta5d6ff (Tffd700{Te6edf3ms_utilTffd700}Ta5d6ff utilised of Tffd700{Te6edf3mslTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRequired propagation stamp cost is Tffd700{Te6edf3pscTffd700}Ta5d6ff, flexibility is Tffd700{Te6edf3scfTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeering cost is Tffd700{Te6edf3pcTffd700}Ta5d6ff, max remote peering cost is Tffd700{Te6edf3pcmTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAccepting propagated messages from Tffd700{Te6edf3who_strTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ptlTffd700}Ta5d6ff message limit, Tffd700{Te6edf3pslTffd700}Ta5d6ff sync limitTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeers : Tffd700{Te6edf3stpTffd700}Ta5d6ff total (peer limit is Tffd700{Te6edf3smpTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3sdpTffd700}Ta5d6ff discovered, Tffd700{Te6edf3sspTffd700}Ta5d6ff staticTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3available_peersTffd700}Ta5d6ff available, Tffd700{Te6edf3unreachable_peersTffd700}Ta5d6ff unreachableTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTraffic : Tffd700{Te6edf3total_incomingTffd700}Ta5d6ff messages received in total (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3total_rx_bytesTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3peered_incomingTffd700}Ta5d6ff messages received from peered nodes (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3peered_rx_bytesTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3upiTffd700}Ta5d6ff messages received from unpeered nodes (Tffd700{Te6edf3uprxTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3peered_outgoingTffd700}Ta5d6ff messages transferred to peered nodes (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3peered_tx_bytesTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3cprrTffd700}Ta5d6ff propagation messages received directly from clientsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3cprsTffd700}Ta5d6ff propagation messages served to clientsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Distribution factor is Tffd700{Te6edf3dfTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3show_peersTb4b4b4:
Tff7b72if Tff7b72not Te6edf3show_statusTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3peer_id Tff7b72in Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3ind Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"
Te6edf3p Tff7b72= Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3peer_idTb4b4b4]
Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffstaticTa5d6ff"Tb4b4b4:
Te6edf3t Tff7b72= Ta5d6ff"Ta5d6ffStatic peer Ta5d6ff"
Tff7b72elif Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4:
Te6edf3t Tff7b72= Ta5d6ff"Ta5d6ffDiscovered peer Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3t Tff7b72= Ta5d6ff"Ta5d6ffUnknown peer Ta5d6ff"
Te6edf3a Tff7b72= Ta5d6ff"Ta5d6ffAvailableTa5d6ff" Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffaliveTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72True Tff7b72else Ta5d6ff"Ta5d6ffUnreachableTa5d6ff"
Te6edf3h Tff7b72= Tffa657maxTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3hops Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_distanceTa5d6ff"Tb4b4b4]
Te6edf3hs Tff7b72= Ta5d6ff"Ta5d6ffhops unknownTa5d6ff" Tff7b72if Te6edf3hops Tff7b72== Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATHFINDER_M Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3hopsTffd700}Ta5d6ff hop awayTa5d6ff" Tff7b72if Te6edf3hops Tff7b72== T79c0ff1 Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3hopsTffd700}Ta5d6ff hops awayTa5d6ff"
Te6edf3pm Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffmessagesTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3pk Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffpeering_keyTa5d6ff"Tb4b4b4]
Te6edf3pc Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3psc Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftarget_stamp_costTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3psf Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffstamp_cost_flexibilityTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3pc Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3pc Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72if Te6edf3psc Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3psc Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72if Te6edf3psf Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3psf Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72if Te6edf3pk Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3pk Tff7b72= Ta5d6ff"Ta5d6ffNot generatedTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3pk Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffGenerated, value is Tffd700{Te6edf3pkTffd700}Ta5d6ff"
Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fflast_sync_attemptTa5d6ff"Tb4b4b4] Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3lsa Tff7b72= Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fflast_sync_attemptTa5d6ff"Tb4b4b4]
Te6edf3ls Tff7b72= Ta5d6fffTa5d6ff"Ta5d6fflast synced Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Tffa657maxTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3lsaTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff agoTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ls Tff7b72= Ta5d6ff"Ta5d6ffnever syncedTa5d6ff"
Te6edf3sstr Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffstrTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4; Te6edf3sler Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fflerTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3stl Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftransfer_limitTa5d6ff"Tb4b4b4]Tff7b72*T79c0ff1000Tb4b4b4) Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftransfer_limitTa5d6ff"Tb4b4b4] Tff7b72else Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Te6edf3ssl Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffsync_limitTa5d6ff"Tb4b4b4]Tff7b72*T79c0ff1000Tb4b4b4) Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffsync_limitTa5d6ff"Tb4b4b4] Tff7b72else Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Te6edf3srxb Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4; Te6edf3stxb Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4; Te6edf3pmo Tff7b72= Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffofferedTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3pmout Tff7b72= Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffoutgoingTa5d6ff"Tb4b4b4]
Te6edf3pmi Tff7b72= Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffincomingTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3pmuh Tff7b72= Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffunhandledTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3ar Tff7b72= Tffa657roundTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffacceptance_rateTa5d6ff"Tb4b4b4]Tff7b72*T79c0ff100Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72if Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3nn Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3nn Tff7b72= Te6edf3sanitize_nameTb4b4b4(Te6edf3pTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3nnTb4b4b4) Tff7b72> T79c0ff45Tb4b4b4: Te6edf3nn Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3nnTb4b4b4[Tb4b4b4:T79c0ff45Tb4b4b4]Tffd700}Ta5d6ff...Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Tffd700{Te6edf3tTffd700}Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3peer_idTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3nnTb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffName : Tffd700{Te6edf3nnTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffStatus : Tffd700{Te6edf3aTffd700}Ta5d6ff, Tffd700{Te6edf3hsTffd700}Ta5d6ff, last heard Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3hTb4b4b4)Tffd700}Ta5d6ff agoTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffCosts : Propagation Tffd700{Te6edf3pscTffd700}Ta5d6ff (flex Tffd700{Te6edf3psfTffd700}Ta5d6ff), peering Tffd700{Te6edf3pcTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffSync key : Tffd700{Te6edf3pkTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffSpeeds : Tffd700{Te6edf3sstrTffd700}Ta5d6ff STR, Tffd700{Te6edf3slerTffd700}Ta5d6ff LERTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffLimits : Tffd700{Te6edf3stlTffd700}Ta5d6ff message limit, Tffd700{Te6edf3sslTffd700}Ta5d6ff sync limitTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffMessages : Tffd700{Te6edf3pmoTffd700}Ta5d6ff offered, Tffd700{Te6edf3pmoutTffd700}Ta5d6ff outgoing, Tffd700{Te6edf3pmiTffd700}Ta5d6ff incoming, Tffd700{Te6edf3arTffd700}Ta5d6ff% acceptance rateTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffTraffic : Tffd700{Te6edf3srxbTffd700}Ta5d6ff received, Tffd700{Te6edf3stxbTffd700}Ta5d6ff sentTa5d6ff"Tb4b4b4)
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3pmTb4b4b4[Ta5d6ff"Ta5d6ffunhandledTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTff7b72*T79c0ff2Tffd700}Ta5d6ffSync state : Tffd700{Te6edf3pmuhTffd700}Ta5d6ff unhandled messageTffd700{Te6edf3msTffd700}Ta5d6ff, Tffd700{Te6edf3lsTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_get_target_identityTb4b4b4(Te6edf3remoteTff7b72=Tff7b72NoneTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3identity
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72def Td2a8ffcheck_timeoutTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResolving remote identity timed out, exiting nowTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3remote Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Te6edf3identity
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3remoteTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDestination hash length must be Tffd700{Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tffd700}Ta5d6ff charactersTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid remote destination hash: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff203Tb4b4b4)
Te6edf3remote_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3remote_identityTb4b4b4: Tff7b72return Te6edf3remote_identity
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3tc Tff7b72= Te6edf3check_timeoutTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tcTb4b4b4: Tff7b72return Te6edf3tc
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72def Td2a8ff_remote_initTb4b4b4(Te6edf3configdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3verbosityTff7b72=T79c0ff0Tb4b4b4, Te6edf3quietnessTff7b72=T79c0ff0Tb4b4b4, Te6edf3identity_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3configpathTb4b4b4, Te6edf3identitypathTb4b4b4, Te6edf3storagedirTb4b4b4, Te6edf3lxmdirTb4b4b4, Te6edf3identity
Tff7b72global Te6edf3lxmd_configTb4b4b4, Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Te6edf3targetlogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_STDOUT
Tff7b72if Te6edf3identity_path Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3configdir Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Ta5d6ff"Ta5d6ff/etc/lxmdTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/etc/lxmd/configTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3configdir Tff7b72= Ta5d6ff"Ta5d6ff/etc/lxmdTa5d6ff"
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmdTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmd/configTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3configdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmdTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3configdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.lxmdTa5d6ff"
Te6edf3configpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Te6edf3identitypath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/identityTa5d6ff"
Te6edf3identity Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3configdirTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSpecified configuration directory does not exist, exiting nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff201Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identitypathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIdentity file not found in specified configuration directory, exiting nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff202Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Te6edf3identitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff4Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIdentity file not found in specified configuration directory, exiting nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff202Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Te6edf3identity_pathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff4Tb4b4b4)
Tff7b72if Te6edf3targetloglevel Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3targetloglevel Tff7b72= T79c0ff3
Tff7b72if Te6edf3verbosity Tff7b72!= T79c0ff0 Tff7b72or Te6edf3quietness Tff7b72!= T79c0ff0Tb4b4b4: Te6edf3targetloglevel Tff7b72= Te6edf3targetloglevelTff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3rnsconfigdirTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4, Te6edf3logdestTff7b72=Te6edf3targetlogdestTb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffLightweight Extensible Messaging DaemonTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative lxmd config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--rnsconfigTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-pTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--propagation-nodeTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrun an LXMF Propagation NodeTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--on-inboundTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffPATHTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffexecutable to run when a message is receivedTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--verboseTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-qTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--quietTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--serviceTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fflxmd is running as a service and should log to fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--statusTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdisplay node statusTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--peersTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdisplay peered nodesTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--syncTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrequest a sync with the specified peerTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-bTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--breakTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffunpeerTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffbreak peering with the specified peerTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--timeoutTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftimeout in seconds for query operationsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--remoteTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffremote propagation node destination hashTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--identityTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to identity used for remote requestsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--exampleconfigTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffprint verbose configuration example to stdout and exitTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6fflxmd Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffexampleconfigTb4b4b4:
Tffa657printTb4b4b4(Te6edf3__default_lxmd_config__Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffstatus Tff7b72or Te6edf3argsTff7b72.Td2a8ffpeersTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4: Te6edf3argsTff7b72.Td2a8fftimeout Tff7b72= T79c0ff5
Te6edf3get_statusTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3rnsconfigdirTff7b72=Te6edf3argsTff7b72.Td2a8ffrnsconfigTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietnessTff7b72=Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3timeoutTff7b72=Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4,
Te6edf3show_statusTff7b72=Te6edf3argsTff7b72.Td2a8ffstatusTb4b4b4,
Te6edf3show_peersTff7b72=Te6edf3argsTff7b72.Td2a8ffpeersTb4b4b4,
Te6edf3identity_pathTff7b72=Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3remoteTff7b72=Te6edf3argsTff7b72.Td2a8ffremoteTb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsyncTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4: Te6edf3argsTff7b72.Td2a8fftimeout Tff7b72= T79c0ff10
Te6edf3request_syncTb4b4b4(Te6edf3targetTff7b72=Te6edf3argsTff7b72.Td2a8ffsyncTb4b4b4,
Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3rnsconfigdirTff7b72=Te6edf3argsTff7b72.Td2a8ffrnsconfigTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietnessTff7b72=Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3timeoutTff7b72=Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4,
Te6edf3identity_pathTff7b72=Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3remoteTff7b72=Te6edf3argsTff7b72.Td2a8ffremoteTb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffunpeerTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4: Te6edf3argsTff7b72.Td2a8fftimeout Tff7b72= T79c0ff10
Te6edf3request_unpeerTb4b4b4(Te6edf3targetTff7b72=Te6edf3argsTff7b72.Td2a8ffunpeerTb4b4b4,
Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3rnsconfigdirTff7b72=Te6edf3argsTff7b72.Td2a8ffrnsconfigTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietnessTff7b72=Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3timeoutTff7b72=Te6edf3argsTff7b72.Td2a8fftimeoutTb4b4b4,
Te6edf3identity_pathTff7b72=Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3remoteTff7b72=Te6edf3argsTff7b72.Td2a8ffremoteTb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Te6edf3program_setupTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3rnsconfigdirTff7b72=Te6edf3argsTff7b72.Td2a8ffrnsconfigTb4b4b4,
Te6edf3run_pnTff7b72=Te6edf3argsTff7b72.Td2a8ffpropagation_nodeTb4b4b4,
Te6edf3on_inboundTff7b72=Te6edf3argsTff7b72.Td2a8ffon_inboundTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietnessTff7b72=Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3serviceTff7b72=Te6edf3argsTff7b72.Td2a8ffserviceTb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Te6edf3__default_lxmd_config__ Tff7b72= Ta5d6ff"""Ta5d6ff# This is an example LXM Daemon config file.
Ta5d6ff# You should probably edit it to suit your
Ta5d6ff# intended usage.
Ta5d6ff[propagation]
Ta5d6ff# Whether to enable propagation node
Ta5d6ffenable_node = no
Ta5d6ff# You can specify identity hashes for remotes
Ta5d6ff# that are allowed to control and query status
Ta5d6ff# for this propagation node.
Ta5d6ff# control_allowed = 7d7e542829b40f32364499b27438dba8, 437229f8e29598b2282b88bad5e44698
Ta5d6ff# An optional name for this node, included
Ta5d6ff# in announces.
Ta5d6ff# node_name = Anonymous Propagation Node
Ta5d6ff# Automatic announce interval in minutes.
Ta5d6ff# 6 hours by default.
Ta5d6ffannounce_interval = 360
Ta5d6ff# Whether to announce when the node starts.
Ta5d6ffannounce_at_start = yes
Ta5d6ff# Wheter to automatically peer with other
Ta5d6ff# propagation nodes on the network.
Ta5d6ffautopeer = yes
Ta5d6ff# The maximum peering depth (in hops) for
Ta5d6ff# automatically peered nodes.
Ta5d6ffautopeer_maxdepth = 6
Ta5d6ff# The maximum amount of storage to use for
Ta5d6ff# the LXMF Propagation Node message store,
Ta5d6ff# specified in megabytes. When this limit
Ta5d6ff# is reached, LXMF will periodically remove
Ta5d6ff# messages in its message store. By default,
Ta5d6ff# LXMF prioritises keeping messages that are
Ta5d6ff# new and small. Large and old messages will
Ta5d6ff# be removed first. This setting is optional
Ta5d6ff# and defaults to 500 megabytes.
Ta5d6ff# message_storage_limit = 500
Ta5d6ff# The maximum accepted transfer size per in-
Ta5d6ff# coming propagation message, in kilobytes.
Ta5d6ff# This sets the upper limit for the size of
Ta5d6ff# single messages accepted onto this node.
Ta5d6ff# propagation_message_max_accepted_size = 256
Ta5d6ff# The maximum accepted transfer size per in-
Ta5d6ff# coming propagation node sync.
Ta5d6ff#
Ta5d6ff# If a node wants to propagate a larger number
Ta5d6ff# of messages to this node, than what can fit
Ta5d6ff# within this limit, it will prioritise sending
Ta5d6ff# the smallest messages first, and try again
Ta5d6ff# with any remaining messages at a later point.
Ta5d6ff# propagation_sync_max_accepted_size = 10240
Ta5d6ff# You can configure the target stamp cost
Ta5d6ff# required to deliver messages via this node.
Ta5d6ff# propagation_stamp_cost_target = 16
Ta5d6ff# If set higher than 0, the stamp cost flexi-
Ta5d6ff# bility option will make this node accept
Ta5d6ff# messages with a lower stamp cost than the
Ta5d6ff# target from other propagation nodes (but
Ta5d6ff# not from peers directly). This allows the
Ta5d6ff# network to gradually adjust stamp cost.
Ta5d6ff# propagation_stamp_cost_flexibility = 3
Ta5d6ff# The peering_cost option configures the target
Ta5d6ff# value required for a remote node to peer with
Ta5d6ff# and deliver messages to this node.
Ta5d6ff# peering_cost = 18
Ta5d6ff# You can configure the maximum peering cost
Ta5d6ff# of remote nodes that this node will peer with.
Ta5d6ff# Setting this to a higher number will allow
Ta5d6ff# this node to peer with other nodes requiring
Ta5d6ff# a higher peering key value, but will require
Ta5d6ff# more computation time during initial peering
Ta5d6ff# when generating the peering key.
Ta5d6ff# remote_peering_cost_max = 26
Ta5d6ff# You can tell the LXMF message router to
Ta5d6ff# prioritise storage for one or more
Ta5d6ff# destinations. If the message store reaches
Ta5d6ff# the specified limit, LXMF will prioritise
Ta5d6ff# keeping messages for destinations specified
Ta5d6ff# with this option. This setting is optional,
Ta5d6ff# and generally you do not need to use it.
Ta5d6ff# prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf
Ta5d6ff# You can configure the maximum number of other
Ta5d6ff# propagation nodes that this node will peer
Ta5d6ff# with automatically. The default is 20.
Ta5d6ff# max_peers = 20
Ta5d6ff# You can configure a list of static propagation
Ta5d6ff# node peers, that this node will always be
Ta5d6ff# peered with, by specifying a list of
Ta5d6ff# destination hashes.
Ta5d6ff# static_peers = e17f833c4ddf8890dd3a79a6fea8161d, 5a2d0029b6e5ec87020abaea0d746da4
Ta5d6ff# You can configure the propagation node to
Ta5d6ff# only accept incoming propagation messages
Ta5d6ff# from configured static peers.
Ta5d6ff# from_static_only = True
Ta5d6ff# By default, stamp validation jobs for PN
Ta5d6ff# sync batches will run sequentially. If
Ta5d6ff# a peer offers messages while another batch
Ta5d6ff# is already processing, it will receive a
Ta5d6ff# throttle response to indicate that it can
Ta5d6ff# retry later. If you have a fast system, you
Ta5d6ff# can disable this to accept and validate
Ta5d6ff# everything as soon as it is offered.
Ta5d6ff# sequential_pn_stamp_validation = yes
Ta5d6ff# You can configure whether static peers are
Ta5d6ff# allowed have their PN syncs processed as
Ta5d6ff# soon as they are offered, regardless of
Ta5d6ff# whether another batch is already validating.
Ta5d6ff# static_peers_bypass_sequential = yes
Ta5d6ff# You can configure how many concurrent inbound
Ta5d6ff# propagation sync transfers will be accepted.
Ta5d6ff# Once this number is reached, nodes offering
Ta5d6ff# messages will receive a throttle response to
Ta5d6ff# indicate that they can retry later. On a slow
Ta5d6ff# system, itTa5d6ff'Ta5d6ffs a good idea to change this to 1.
Ta5d6ff# max_inbound_syncs = 3
Ta5d6ff# By default, any destination is allowed to
Ta5d6ff# connect and download messages, but you can
Ta5d6ff# optionally restrict this. If you enable
Ta5d6ff# authentication, you must provide a list of
Ta5d6ff# allowed identity hashes in the a file named
Ta5d6ff# Ta5d6ff"Ta5d6ffallowedTa5d6ff"Ta5d6ff in the lxmd config directory.
Ta5d6ffauth_required = no
Ta5d6ff[lxmf]
Ta5d6ff# The LXM Daemon will create an LXMF destination
Ta5d6ff# that it can receive messages on. This option sets
Ta5d6ff# the announced display name for this destination.
Ta5d6ffdisplay_name = Anonymous Peer
Ta5d6ff# It is possible to announce the internal LXMF
Ta5d6ff# destination when the LXM Daemon starts up.
Ta5d6ffannounce_at_start = no
Ta5d6ff# You can also announce the delivery destination
Ta5d6ff# at a specified interval. This is not enabled by
Ta5d6ff# default.
Ta5d6ff# announce_interval = 360
Ta5d6ff# You can configure the required stamp cost for
Ta5d6ff# incoming messages.
Ta5d6ff# stamp_cost = 12
Ta5d6ff# The maximum accepted unpacked size for mes-
Ta5d6ff# sages received directly from other peers,
Ta5d6ff# specified in kilobytes. Messages larger than
Ta5d6ff# this will be rejected before the transfer
Ta5d6ff# begins.
Ta5d6ffdelivery_transfer_max_accepted_size = 1
Ta5d6ff# You can configure an external program to be run
Ta5d6ff# every time a message is received. The program
Ta5d6ff# will receive as an argument the full path to the
Ta5d6ff# message saved as a file. The example below will
Ta5d6ff# simply result in the message getting deleted as
Ta5d6ff# soon as it has been received.
Ta5d6ff# on_inbound = rm
Ta5d6ff[logging]
Ta5d6ff# Valid log levels are 0 through 7:
Ta5d6ff# 0: Log only critical information
Ta5d6ff# 1: Log errors and lower log levels
Ta5d6ff# 2: Log warnings and lower log levels
Ta5d6ff# 3: Log notices and lower log levels
Ta5d6ff# 4: Log info and lower (this is the default)
Ta5d6ff# 5: Verbose logging
Ta5d6ff# 6: Debug logging
Ta5d6ff# 7: Extreme logging
Ta5d6ffloglevel = 4
Ta5d6ff"""
Tff7b72import T7ee787re
Tff7b72import T7ee787unicodedata
Te6edf3STRIP_BLOCKS_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(
Ta5d6ff'Ta5d6ff[Ta5d6ff'
Ta5d6ff'Tffea00\U0001F600Ta5d6ff-Tffea00\U0001F64FTa5d6ff' T8b949e# Emoticons
Ta5d6ff'Tffea00\U0001F300Ta5d6ff-Tffea00\U0001F5FFTa5d6ff' T8b949e# Misc Symbols & Pictographs
Ta5d6ff'Tffea00\U0001F680Ta5d6ff-Tffea00\U0001F6FFTa5d6ff' T8b949e# Transport & Map Symbols
Ta5d6ff'Tffea00\U0001F700Ta5d6ff-Tffea00\U0001F77FTa5d6ff' T8b949e# Alchemical Symbols
Ta5d6ff'Tffea00\U0001F780Ta5d6ff-Tffea00\U0001F7FFTa5d6ff' T8b949e# Geometric Shapes Extended
Ta5d6ff'Tffea00\U0001F800Ta5d6ff-Tffea00\U0001F8FFTa5d6ff' T8b949e# Supplemental Arrows-C
Ta5d6ff'Tffea00\U0001F900Ta5d6ff-Tffea00\U0001F9FFTa5d6ff' T8b949e# Supplemental Symbols & Pictographs
Ta5d6ff'Tffea00\U0001FA00Ta5d6ff-Tffea00\U0001FA6FTa5d6ff' T8b949e# Chess Symbols
Ta5d6ff'Tffea00\U0001FA70Ta5d6ff-Tffea00\U0001FAFFTa5d6ff' T8b949e# Symbols & Pictographs Extended-A
Ta5d6ff'Tffea00\U0001F1E0Ta5d6ff-Tffea00\U0001F1FFTa5d6ff' T8b949e# Flags (iOS/regional indicators)
Ta5d6ff'Tffea00\u2600Ta5d6ff-Tffea00\u26FFTa5d6ff' T8b949e# Misc Symbols (☀, ☁, ☂, etc.)
Ta5d6ff'Tffea00\u2700Ta5d6ff-Tffea00\u27BFTa5d6ff' T8b949e# Dingbats (✂, ✈, ✉, etc.)
Ta5d6ff'Tffea00\uFE00Ta5d6ff-Tffea00\uFE0FTa5d6ff' T8b949e# Variation Selectors
Ta5d6ff'Tffea00\U000E0100Ta5d6ff-Tffea00\U000E01EFTa5d6ff' T8b949e# Variation Selectors Supplement
Ta5d6ff'Tffea00\U0001F3FBTa5d6ff-Tffea00\U0001F3FFTa5d6ff' T8b949e# Emoji modifiers (skin tones)
Ta5d6ff'Ta5d6ff]+Ta5d6ff'Tb4b4b4,
Te6edf3flagsTff7b72=Te6edf3reTff7b72.Td2a8ffUNICODE
Tb4b4b4)
Te6edf3STRIP_CONTROL_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(
Ta5d6ff'Ta5d6ff[Ta5d6ff'
Ta5d6ff'Tffea00\x00Ta5d6ff-Tffea00\x08Ta5d6ff' T8b949e# C0 controls (NUL-BS)
Ta5d6ff'Tffea00\x0BTffea00\x0CTa5d6ff' T8b949e# VT, FF
Ta5d6ff'Tffea00\x0ETa5d6ff-Tffea00\x1FTa5d6ff' T8b949e# C0 controls (SO-US)
Ta5d6ff'Tffea00\x7FTa5d6ff-Tffea00\x9FTa5d6ff' T8b949e# DEL and C1 controls
Ta5d6ff'Tffea00\u200BTa5d6ff-Tffea00\u200FTa5d6ff' T8b949e# Zero-width chars, LRM, RLM, etc.
Ta5d6ff'Tffea00\u202ATa5d6ff-Tffea00\u202ETa5d6ff' T8b949e# Bidi embedding controls
Ta5d6ff'Tffea00\u2060Ta5d6ff-Tffea00\u206FTa5d6ff' T8b949e# Format chars (word joiner, etc.)
Ta5d6ff'Tffea00\uFEFFTa5d6ff' T8b949e# BOM / Zero Width NBSP
Ta5d6ff'Tffea00\uFFF0Ta5d6ff-Tffea00\uFFF8Ta5d6ff' T8b949e# Specials
Ta5d6ff'Ta5d6ff]+Ta5d6ff'Tb4b4b4,
Te6edf3flagsTff7b72=Te6edf3reTff7b72.Td2a8ffUNICODE
Tb4b4b4)
Te6edf3STRIP_PRIVATE_RE Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(
Ta5d6ff'Ta5d6ff[Ta5d6ff'
Ta5d6ff'Tffea00\uD800Ta5d6ff-Tffea00\uDFFFTa5d6ff' T8b949e# Surrogates
Ta5d6ff'Tffea00\uE000Ta5d6ff-Tffea00\uF8FFTa5d6ff' T8b949e# Private Use Area
Ta5d6ff'Tffea00\uF900Ta5d6ff-Tffea00\uFAFFTa5d6ff' T8b949e# CJK Compatibility Ideographs (keep? strip for safety)
Ta5d6ff'Tffea00\uFE10Ta5d6ff-Tffea00\uFE1FTa5d6ff' T8b949e# Vertical Forms
Ta5d6ff'Tffea00\uFE20Ta5d6ff-Tffea00\uFE2FTa5d6ff' T8b949e# Combining Half Marks
Ta5d6ff'Tffea00\U000F0000Ta5d6ff-Tffea00\U000FFFFFTa5d6ff' T8b949e# Supplementary Private Use Area-A
Ta5d6ff'Tffea00\U00100000Ta5d6ff-Tffea00\U0010FFFFTa5d6ff' T8b949e# Supplementary Private Use Area-B
Ta5d6ff'Ta5d6ff]+Ta5d6ff'Tb4b4b4,
Te6edf3flagsTff7b72=Te6edf3reTff7b72.Td2a8ffUNICODE
Tb4b4b4)
Tff7b72def Td2a8ffsanitize_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name Tff7b72is Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72None
Te6edf3name Tff7b72= Tffa657strTb4b4b4(Te6edf3nameTb4b4b4)
Te6edf3name Tff7b72= Te6edf3unicodedataTff7b72.Td2a8ffnormalizeTb4b4b4(Ta5d6ff'Ta5d6ffNFKCTa5d6ff'Tb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3result Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3char Tff7b72in Te6edf3nameTb4b4b4:
Te6edf3cat Tff7b72= Te6edf3unicodedataTff7b72.Td2a8ffcategoryTb4b4b4(Te6edf3charTb4b4b4)
Te6edf3cat_prefix Tff7b72= Te6edf3catTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72if Te6edf3cat Tff7b72else Ta5d6ff'Ta5d6ffCTa5d6ff'
Tff7b72if Te6edf3cat_prefix Tff7b72in Tb4b4b4(Ta5d6ff'Ta5d6ffLTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffNTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4)Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffappendTb4b4b4(Te6edf3charTb4b4b4)
Tff7b72elif Te6edf3cat Tff7b72== Ta5d6ff'Ta5d6ffZsTa5d6ff'Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4)
Tff7b72elif Te6edf3cat Tff7b72in Tb4b4b4(Ta5d6ff'Ta5d6ffZlTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffZpTa5d6ff'Tb4b4b4)Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4)
Tff7b72elif Te6edf3cat Tff7b72== Ta5d6ff'Ta5d6ffMcTa5d6ff'Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffappendTb4b4b4(Te6edf3charTb4b4b4)
Tff7b72elif Te6edf3cat Tff7b72== Ta5d6ff'Ta5d6ffLmTa5d6ff'Tb4b4b4: Te6edf3resultTff7b72.Td2a8ffappendTb4b4b4(Te6edf3charTb4b4b4)
Te6edf3name Tff7b72= Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3name Tff7b72= Te6edf3STRIP_BLOCKS_RETff7b72.Td2a8ffsubTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3name Tff7b72= Te6edf3STRIP_CONTROL_RETff7b72.Td2a8ffsubTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3name Tff7b72= Te6edf3STRIP_PRIVATE_RETff7b72.Td2a8ffsubTb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3name Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrTa5d6ff'Ta5d6ff\Ta5d6ffs+Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff Ta5d6ff'Tb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3name Tff7b72= Te6edf3nameTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3name
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4: Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────